home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource5 / 349_01 / sss.arc / EX_0807.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-04-10  |  2.6 KB  |  138 lines

  1. Program EX_0807;
  2. {Listing 18P - see documentation in TUTOR.SSS}
  3.  
  4. uses SSS, crt;
  5. { For Pascal other than Turbo/Quick erase above line }
  6.  
  7. const
  8.   ARRIVL = 1;
  9.   STARTA = 2;
  10.   ENDACT = 3;
  11.   NEXTAC = 4;
  12.  
  13.   TIMEL  = 120;
  14.  
  15. { For MS Pascal $include:'SSSP1.H' }
  16.  
  17. var
  18.   n, countr, server, ecode : integer;
  19.   t0 : real;
  20.  
  21. { For MS Pascal $include:'SSSP2.H' }
  22.  
  23. procedure signal(s:string; v: real; w,d: integer);
  24. var x, y: integer;
  25. begin
  26.   x := wherex;
  27.   y := wherey;
  28.   clreol;
  29.   write(s,v:w:d);
  30.   gotoxy(x,y);
  31. end;
  32.  
  33. procedure prime;
  34. begin
  35.   n := 0;
  36.   countr := 0;
  37.   server := 1;
  38.   t0 := 0;
  39.   INIQUE(2,1,1);
  40.   INISTA(1,'bus',1,0,0,0);
  41.   TALLY(1, server);
  42.   CREATE(0, n);
  43. end;
  44.  
  45. procedure resque;
  46. begin
  47.   CLEARS(0);
  48.   CLEARQ(0);
  49.   while NQ(1) > 0 do begin REMVFQ(1,1); DISPOS; end;
  50.   while NC    > 0 do begin REMVFC(1);   DISPOS; end;
  51. end;
  52.  
  53. procedure endper;
  54. begin
  55.   case countr of
  56.   0:
  57.      begin
  58.        SETSEE(777);
  59.        SETANT(0);
  60.      end;
  61.   1:
  62.      writeln('# average avail.s duration    ');
  63.   2:
  64.      writeln(countr:1,QAVG(1):8:1,SAVG(1):8:3,
  65.              (T - t0):9:2,'    ');
  66.   3:
  67.      begin
  68.        writeln(countr:1,QAVG(1):8:1,SAVG(1):8:3,
  69.              (T - t0):9:2,'    ');
  70.        QUEUE(2,0);
  71.        resque;
  72.        server := 1;
  73.        REMVFQ(2,1);
  74.        SETSEE(777);
  75.        SETANT(1);
  76.      end;
  77.   4:
  78.      ;
  79.   5:
  80.      writeln(countr:1,QAVG(1):8:1,SAVG(1):8:3,
  81.              (T - t0):9:2,'    ');
  82.   6:
  83.      begin
  84.        writeln(countr:1,QAVG(1):8:1,SAVG(1):8:3,
  85.              (T - t0):9:2,'    ');
  86.        SIMEND(0);
  87.      end;
  88.   end;
  89.   CLEARS(0);
  90.   CLEARQ(1);
  91.   countr := countr + 1;
  92.   t0 := T;
  93. end;
  94.  
  95. begin
  96.  
  97.   prime;
  98.  
  99.   repeat
  100.     ecode := NEXTEV;
  101.     if ecode > 0 then
  102.     begin
  103.       case ecode of
  104.  
  105.       ARRIVL: begin
  106.                 if n = countr*TIMEL then endper;
  107.                 n := n + 1;
  108.                 signal('Simulated time: ',T,7,2);
  109.                 SETA(1, EX(0.9));
  110.                 CREATE(EX(1), n);
  111.                 SCHED(0, NEXTAC, IDE);
  112.               end;
  113.  
  114.       NEXTAC: if server > 0 then SCHED(0, STARTA, IDE)
  115.               else               QUEUE(1, 0);
  116.  
  117.       STARTA: begin
  118.                  SCHED(A(1), ENDACT, IDE);
  119.                  server := server - 1;
  120.                  TALLY(1, server);
  121.               end;
  122.  
  123.       ENDACT: begin
  124.                 DISPOS;
  125.                 server := server + 1;
  126.                 TALLY(1, server);
  127.                 if NQ(1) > 0 then
  128.                 begin
  129.                   REMVFQ(1,1);
  130.                   SCHED(0, STARTA, IDE);
  131.                 end;
  132.               end;
  133.       end;
  134.     end;
  135.   until ecode = 0;
  136.  
  137. end.
  138.